
import { getRealIp, User } from './utils.js'
import cookieParser from 'socket.io-cookie-parser'
import socketio from 'socket.io'

const socket = (http) => {
  const io = socketio(http, {
    serveClient: true,
    pingInterval: 10000,
    pingTimeout: 5000,
    cookie: true
  });
  io.use(cookieParser()); 

  const userInfo = {};  // 当前这个user对象只是保存加入的名字，然后离开时调取。没有别的状态维护。
  let adminSocket = null
  const getOnlineUsers = (admin = false) => {
    const onlineUsers = Object.values(userInfo).filter((user) => {
      return user && user.online
    })
    if (admin) {
      return onlineUsers
    } else {
      return onlineUsers.map((user) => {
        // 非管理员私有
        return user.clientAccess()
      })
    }
  }
  let messages = []
  io.on('connect', socket => {
    // 挂载回调
    socket.on('message', (user, msg) => {
      // 客户端发信息
      messages.push({ user, msg })
      io.emit('message', user, msg)
    })
    socket.on('file', (user, name, realName) => {
      // 客户端传文件
      messages.push({ user, name, realName })
      io.emit('file', user, name, realName)
    })
    socket.on('notify', (user, type) => {
      // 客户端：通知广播。1是各自客户端给的，23是管理员端给的
      if (adminSocket && socket.id == adminSocket.id) {
        const userId = user.id
        // 管理员设置vip
        switch (type) {
          case 2:
            userInfo[userId].svip = true
            break;
          case 3:
            userInfo[userId].svip = false
            break;
          default:
            break;
        }
        user = userInfo[userId].clientAccess()
        const users = getOnlineUsers()
        adminSocket.broadcast.emit('notify', user, type, users);
        adminSocket.emit('notify', userInfo[userId], type, getOnlineUsers(true));
      } else {
        console.log('服务器是收不到notify的！');
      }
    })
    // 服务器端：用户退出
    socket.on('disconnect', ()=>{
      const user = userInfo[socket.id];
      if (user) {
        user.online = false
        if (adminSocket) {
          adminSocket.broadcast.emit('notify', user.clientAccess(), 1, getOnlineUsers())
          adminSocket.emit('notify', user, 1, getOnlineUsers(true))
        } else {
          io.emit('notify', user.clientAccess(), 1, getOnlineUsers())
        }
        console.log(`${user.name} 离开了群聊`);
      } else {
        adminSocket = null
        console.log('管理员大人退出了监听');
      }
    })
    // 正式安排接入后的行为
    if (getRealIp(socket) == '::ffff:127.0.0.1') {
      const user = new User('', true, socket.id)
      socket.emit('notify', user, -1, getOnlineUsers(true));
      adminSocket = socket
      console.log(`伟大又无敌的管理员大人来啦！`);
    } else {
      // 非管理员用户：先设置用户集合，发送join消息
      console.log(userInfo[socket.id]);
      const user = userInfo[socket.id] ? userInfo[socket.id] : new User(socket.request.cookies['username'], false, socket.id)
      userInfo[socket.id] = user
      user.online = true
      // 注意这里有没有adminsocket广播的方式不同
      if (adminSocket) {
        adminSocket.broadcast.emit('notify', user.clientAccess(), 0, getOnlineUsers());
        adminSocket.emit('notify', user, 0, getOnlineUsers(true));
      } else {
        io.emit('notify', user.clientAccess(), 0, getOnlineUsers());
      }
      console.log(`${user.name} 加入群聊，ipv6 ${getRealIp(socket)}`);
    }
  })
  console.log('emm');
}
// 该模块导出一个函数，调用时传入http服务器作为参数
export default socket